home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1994 November / Cd Ware (Nro. 2) - Epimundo.iso / DOS / PG / STRX.ZIP / STR.H < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-12  |  13.3 KB  |  377 lines

  1. //
  2. // str.h   : str class interface
  3. // Author  : Roy S. Woll
  4. //
  5. // Copyright (c) 1993 by Roy S. Woll
  6. // You may distribute this source freely as long as you leave all files
  7. // in their original form, including the copyright notice as is.
  8. //
  9. // Version 3.0     05/07/94  Borland 4 compatibility, reverse searching
  10. //                           ltostr, strtol, itostr, strtoi, hashValue
  11. // Version 2.2     05/16/93  Add member function read, lowercase,
  12. //                           uppercase, and variations of pad and strip.
  13. // Version 2.01    03/01/93  Support Turbo C++ (no nested class)
  14. // Version 2.00    12/01/92
  15. //
  16. #ifndef _STR_H
  17. #define _STR_H
  18.  
  19. //#define DEBUG_STR
  20.  
  21. #include <dlldefs.h>
  22.  
  23. class _CLASSTYPE ostream;
  24. class _CLASSTYPE istream;
  25. class _CLASSTYPE dynstream;
  26. class _CLASSTYPE regX;
  27.  
  28. #ifdef __TURBOC__
  29.     #ifndef __BORLANDC__
  30.         #define _SUBSTR substr
  31.     #else
  32.         #define _SUBSTR str::substr
  33.         class _CLASSTYPE str {
  34.         public:
  35.     #endif
  36. #else
  37.     #define _SUBSTR str::substr
  38.     class _CLASSTYPE str {
  39.       public:
  40. #endif
  41.  
  42.     class _CLASSTYPE substr{
  43.      friend class str;
  44.  
  45.      int posReplace;
  46.      int numReplace;
  47.      str * mystr;
  48.  
  49.      substr(const str * data, int AposReplace, int AnumReplace);
  50.  
  51.      int compare(const char *) const;
  52.      int compare(const substr&) const;
  53.      int length() const;
  54.      
  55.    public:
  56.      str & operator = (const substr& s);
  57.       str & operator = (const char * s);
  58.      
  59.      str operator+(const char *) const;
  60.      str operator+(const substr&) const;
  61.      int operator==(const char *) const;
  62.      int operator<=(const char *) const;
  63.      int operator>=(const char *) const;
  64.      int operator!=(const char *) const;
  65.      int operator< (const char *) const;
  66.      int operator> (const char *) const;
  67.      int operator==(const substr&) const;
  68.      int operator<=(const substr&) const;
  69.      int operator>=(const substr&) const;
  70.      int operator!=(const substr&) const;
  71.      int operator< (const substr&) const;
  72.      int operator> (const substr&) const;
  73.      
  74.      operator str() const;
  75.     };
  76.  
  77. #ifdef __TURBOC__
  78.     #ifndef __BORLANDC__
  79.         class _CLASSTYPE str {
  80.     #endif
  81. #endif
  82.  
  83.    friend class dynstreambuf;
  84.  
  85. protected:
  86.    enum {STR_DEFAULT_MEMINCR=256};
  87.    enum {ICASE=1};
  88.  
  89. #ifdef DEBUG_STR
  90. public:
  91.    static int dynstreamCount;
  92.    static int ObjectCount;
  93.    static int AllocationCount;
  94.    static int TotalObjectCount;
  95.    static int TotalAllocationCount;
  96. #endif
  97.  
  98.    friend class substr;
  99.  
  100.  
  101.    struct strdata{
  102.      enum {STR_DEBUG_BUFSIZE=80};
  103.      int cursize;         // cursize should be defined before buf!
  104.      int curlength;       // current length of buffer
  105.      int refcount;
  106.  
  107.      dynstream * mystream;// pointer to str's stream
  108.      char strChange;      // Internal flag indicating when the length has been
  109.                           // changed by the str class.  
  110.                           // If true, stream is notified.
  111.      char buf[STR_DEBUG_BUFSIZE];
  112.                          // buf[1] is all that is required, but we allow
  113.                          //   it to be buf[80] so that the debugger can
  114.                          //   treat it as a char *.
  115.    };
  116.  
  117.     static strdata NullData;
  118.    static int defaultFlags;
  119.  
  120.    int memsize_init;     // Initial amount of memory to allocate for buffer
  121.    int memsize_incr;     // Memory expansion increment
  122.    int flags;            // Default flags for case sensitivity, etc.
  123.  
  124.    str& _assign (const char * source, int len);
  125.    str& _concat (const char * source, int len);
  126.    int _checkMemAllocation(int requiredLen=0);
  127.  
  128.    static void init(strdata *&, int, int);
  129.  
  130. protected:
  131.  
  132.    strdata * data;
  133.    char * getNewBuffer( int len, int newbufsize);
  134.    char * getNewBuffer(int newbufsize);
  135.  
  136.    void setNewBuffer(strdata * newdata, int newbufsize, int len);
  137.  
  138.    void setlength(int len) const;   // update the current length
  139.  
  140.    int strncmp(const char * s1, const char * s2, int n) const;
  141.    int strcmp(const char * s1, const char * s2) const;
  142.  
  143. //
  144. // Special constructors used by implementation
  145. //
  146.    str(const char *, const char *);
  147.    str(const char *, const _SUBSTR&);
  148.    str(const substr&, const char *);
  149.    str(const substr&, const substr&);
  150.  
  151.  
  152. public:
  153.  
  154.    enum {END_OF_STRING=-1};
  155. //
  156. // Constructors
  157. //
  158.    str(void);
  159.    str(int p_bufsize, int = STR_DEFAULT_MEMINCR);
  160.    str(const char * s, int bufsize=0, int = STR_DEFAULT_MEMINCR);
  161.    str(const str&, int bufsize=0, int = STR_DEFAULT_MEMINCR);
  162.  
  163.    virtual ~str();
  164.  
  165. //
  166. // Access Operators
  167. //
  168.    int size(void) const;        // return current memory allocated for buffer
  169.    int length(void) const;      // return current string length of buffer
  170.  
  171.    operator const char * () const;    // for implicit casting 
  172.    const char * operator()() const;           // for explicit casting
  173.    const char * operator()(int index) const;  // 
  174.  
  175. //
  176. // String substitution using substr "() syntax"
  177. //
  178.    substr operator()(int pos, int numreplace); // create substr from str
  179.    const substr operator()(int pos, int numreplace) const;
  180.  
  181. //
  182. // String search/replace member functions
  183. //
  184.    int search (char, int * startPtr) const;
  185.    int search (char, int start=0) const;
  186.    int search (const char *, int * startPtr) const;
  187.    int search (const char *, int start=0) const;
  188.    int search (const regX&, int * startPtr) const;
  189.    int search (const regX&, int start) const;
  190.    int search (const regX&, str * matchPtr=0, int start=0) const;
  191.    int search (const regX&, str * matchPtr, int * startPtr) const;
  192.    int searchr (char, int * startPtr) const;
  193.    int searchr (char, int start=0) const;
  194.    int searchr (const char *, int * startPtr) const;
  195.    int searchr (const char *, int start=END_OF_STRING) const;
  196.    int searchr (const regX&, int * startPtr) const;
  197.    int searchr (const regX&, int start) const;
  198.    int searchr (const regX&, str * matchPtr=0, int start=END_OF_STRING) const;
  199.    int searchr (const regX&, str * matchPtr, int * startPtr) const;
  200.  
  201.    int index (char, int start=0) const;
  202.    int index (const char *, int start=0) const;
  203.    int index (const regX&, int start=0) const;
  204.    int index (const regX&, int * matchLen, int start=0) const;
  205.    int indexr (char, int start=END_OF_STRING) const;
  206.    int indexr (const char *, int start=END_OF_STRING) const;
  207.    int indexr (const regX&, int start=END_OF_STRING) const;
  208.    int indexr (const regX&, int * matchLen, int start=END_OF_STRING) const;
  209.  
  210.  
  211.    int replace (const regX&, const char * replaceString, 
  212.                int* startPtr, int numReplacements=1);
  213.     int replace (const char * pattern, const char * replaceString,
  214.                int* startPtr, int numReplacements=1);
  215.    int replace (const regX&, const char * replaceString, 
  216.                int start=0, int numReplacements=1);
  217.    int replace (const char * pattern, const char * replaceString, 
  218.                int start=0, int numReplacements=1);
  219.     int replaceAll (const char *, const char * replaceString, int start=0);
  220.     int replaceAll (const regX&, const char * replaceString, int start=0);
  221.     int replacer (const regX&, const char * replaceString,
  222.                int* startPtr, int numReplacements=1);
  223.    int replacer (const regX&, const char * replaceString, 
  224.                int start=END_OF_STRING, int numReplacements=1);
  225.    int replacer (const char * pattern, const char * replaceString, 
  226.                int* startPtr, int numReplacements=1);
  227.    int replacer (const char * pattern, const char * replaceString, 
  228.                int start=END_OF_STRING, int numReplacements=1);
  229.  
  230.     int count(const char ch, int start=0) const; // return occurences of ch
  231.     int count(const char *, int start=0);
  232.     int count(const regX&, int start=0);
  233.  
  234.    char& operator[](int position);            // array indexing
  235.    char operator[](int position) const;       // array indexing for const
  236.  
  237.    ostream& stream(void);    // return stream for this str
  238.    ostream& stream(int);     // return stream and move put pointer
  239.  
  240. //
  241. // Assignment & Concatenation Operators
  242. //
  243.    str & operator = (const str & s);     // s = str;
  244.    str & operator = (const substr & s);  // s = substr;
  245.    str & operator = (const char * s);    // s = charptr
  246.    str & operator = (const char s);      // s = character
  247.    str & assign (const char * source, int len=32767);
  248.  
  249.    str & operator += (const str & s);    // s += str
  250.    str & operator += (const substr & s); // s += substr
  251.    str & operator += (const char * s);   // s += charptr
  252.    str & operator += (const char s);     // s += char
  253.  
  254.    str & operator << (const str& s);     // s << str
  255.    str & operator << (const substr& s);  // s << substr
  256.    str & operator << (const char * s);   // s << charptr
  257.    str & operator << (const int s);      // s << int
  258.    str & operator << (const char s);     // s << char
  259.    str & operator << (const long s);     // s << long
  260.  
  261. // Manipulators
  262.    enum PadStripT {left, right, both, leading=0, trailing};
  263.    
  264.    str& strip(PadStripT t=trailing, const char * stripchar=" \t");
  265.    str& strip(PadStripT t, char stripchar);
  266.    str& stripTrailing(const char * stripchar=" \t");
  267.    str& stripLeading(const char * stripchar=" \t");
  268.     str& stripBoth(const char * stripchar=" \t");
  269.     
  270.    str& pad(int padsize, PadStripT t=right, char padchar = ' ');
  271.    str& padRight(int padsize, char padchar = ' ');
  272.    str& padLeft(int padsize, char padchar = ' ');
  273.    str& padBoth(int padsize, char padchar = ' ');
  274.     
  275.    str& lowercase(); // convert this string to lowercase
  276.    str& uppercase(); // convert this string to uppercase
  277.  
  278.     
  279. // Mutators
  280.    int insert(int pos, char ch);       // insert ch, return 0 if fail
  281.    int insert(int pos, const char * insertStr); 
  282.                                        // insert char *, return 0 if fail
  283.    void remove(int pos, int numdel=1); // remove numdel characters starting at
  284.                                        //   position pos
  285.    void setLength(int len);            // update the current length
  286.  
  287.    str operator+(const str &) const;
  288.    str operator+(const substr &) const;
  289.    str operator+(const char * b) const;
  290.    str operator+(const char b) const;
  291.  
  292.    int operator==(const char *) const;  // made member functions so that
  293.    int operator<=(const char *) const;  // derived classes inherit functions
  294.    int operator>=(const char *) const;
  295.    int operator!=(const char *) const;
  296.    int operator< (const char *) const;
  297.    int operator> (const char *) const;
  298.  
  299.    int operator==(const str &) const;
  300.    int operator<=(const str &) const;
  301.    int operator>=(const str &) const;
  302.    int operator!=(const str &) const;
  303.    int operator< (const str &) const;
  304.    int operator> (const str &) const;
  305.  
  306. // Friend Stream Operators
  307.     istream& read(istream&, int);
  308.    friend istream& _ExportFunction operator >> (istream&, str &);
  309.    friend ostream& _ExportFunction operator << (ostream&, const str &);
  310.  
  311.    friend int _ExportFunction compare(const str&, const char *);
  312.    friend int _ExportFunction compare(const str&, const str &);
  313.    friend int _ExportFunction compare(const char *, const str &);
  314.  
  315.    friend str _ExportFunction operator+(const char *, const str &); 
  316.    friend str _ExportFunction operator+(const char *, const _SUBSTR &); 
  317.  
  318.    friend str _ExportFunction strip(str, PadStripT t=trailing, 
  319.                               const char * stripchar=" \t");
  320.    friend str _ExportFunction strip(str, PadStripT t, char stripchar);
  321.    friend str _ExportFunction pad(str s, int padsize, PadStripT t=right, 
  322.                           char padchar= ' ');
  323.    friend str _ExportFunction lowercase(const char *); // return lower case of string
  324.    friend str _ExportFunction uppercase(const char *); // return upper case of string
  325.    friend str _ExportFunction itostr(int);             // convert int to str
  326.     friend int _ExportFunction strtoi(const str&);      // convert str to int
  327.     friend str _ExportFunction ltostr(long);             // convert long to str
  328.     friend long _ExportFunction strtol(const str&);      // convert str to long
  329.  
  330.  
  331.  //
  332.  // Case sensitivity functions
  333.  //
  334.    static void setdefaultCaseSensitive(int val);
  335.    void setCaseSensitive(int val);
  336.    int caseSensitive(void) const;
  337.     
  338.    unsigned HashValue() const;
  339.     
  340. };
  341.  
  342. //
  343. // Define inline functions
  344. //
  345. inline const char * str::operator()() const   // for explicit casting
  346.      {return (const char *)*this;}
  347.  
  348. inline char str::operator[](int position) const{  // array indexing
  349.    return data->buf[position];
  350. }
  351.  
  352. inline void str::setlength(int len) const{   // update the current length
  353.    data->buf[len]=0;     // null terminated
  354.    data->curlength=len;
  355.    data->strChange=1;
  356. }
  357.  
  358. //
  359. // Global member function operators
  360. //
  361.    int _ExportFunction operator==(const char *, const str &);
  362.    int _ExportFunction operator<=(const char *, const str &);
  363.    int _ExportFunction operator>=(const char *, const str &);
  364.    int _ExportFunction operator!=(const char *, const str &);
  365.    int _ExportFunction operator< (const char *, const str &);
  366.    int _ExportFunction operator> (const char *, const str &);
  367.  
  368.    int _ExportFunction operator==(const char *, const _SUBSTR &);
  369.    int _ExportFunction operator<=(const char *, const _SUBSTR &);
  370.    int _ExportFunction operator>=(const char *, const _SUBSTR &);
  371.    int _ExportFunction operator!=(const char *, const _SUBSTR &);
  372.    int _ExportFunction operator< (const char *, const _SUBSTR &);
  373.    int _ExportFunction operator> (const char *, const _SUBSTR &);
  374.  
  375.  
  376. #endif
  377.